// 扩展与复用
package main

import (
	"fmt"
)

type Pet struct {
}

func (p *Pet) speek() {
	fmt.Print("...")
}

func (p *Pet) speekTo(name string) {
	p.speek()
	fmt.Print(" ", name)
}

type Dog struct {
	// 内嵌，实现类似继承的功能
	Pet
}

func (d *Dog) speek() {
	fmt.Print("wang!")
}

func (d *Dog) speekTo(name string) {
	d.speek()
	fmt.Print(" ", name)
}

func main() {
	// 不支持，编译会报错
	//var dog *Pet
	var dog *Dog
	dog = new(Dog)
	// 如果只重写 speek() ，不重写 speekTo()，是无法调用子类的 speek() 方法的
	dog.speekTo("zxy")
}
